iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
AI & Data

看對話學 Python 資料分析,用情境故事帶你入門系列 第 27

Day-27 用 Python 製作 PPT 投影片,一鍵搞定!(上)

  • 分享至 

  • xImage
  •  


原來做報告,也可以直接寫程式!Licensed by Adobe Stock

在忙碌一整天之後, Meiko 和 Jason 在附近的小吃店果腹,Meiko 眉頭深鎖似乎在想些什麼。

Jason:「誒,你臉色看起來不太好,發生了什麼事?」

Meiko:「也還好拉,只是最近老闆要我幫他整理資料,還要做成一個完整的簡報,實在讓我很傷腦筋。老實說可以用先前你教我的 Python 做資料分析是蠻開心的,可是處理資料後要把這些做好的資料複製貼上,或是打一堆說明文字,就真的讓我有點煩心。」

Jason:「是唷,你知道,Python 也可以用來製作 PPT 投影片嗎?尤其是它可以幫你把 Matplotlib 做好的圖檔,直接放到 ppt 上面,這樣是不是就省了很多事啊?」

Meiko:「這麼神奇,那你還不趕快教我?」

Jason:「別急,你要在本機端先安裝 python-pptx 的模組才行,要現在命令提示列裡面或是終端機(Terminal)先安裝起來!」

  • Windows: conda install -c conda-forge python-pptx
  • MacOS: pip install python-pptx

Meiko:「還好你先教我用 Anaconda,只要用 conda install 那行就可以正確安裝了!」

Jason:「好,那我們話不多說,先做出第一頁的 Python 簡報來看看!」

# -*- coding: UTF-8 -*-
from pptx import Presentation
#開啟新的簡報物件
prs = Presentation()
#建立簡報檔第一張頁面物件
title_slide_layout = prs.slide_layouts[0] 
#增加一張簡報
slide = prs.slides.add_slide(title_slide_layout)
#設定第一張簡報的標題 
title = slide.shapes.title
title.text = "Hello Python PPT"
#設定第一張簡報的副標題
subtitle = slide.placeholders[1]
subtitle.text = "作者:Meiko 2020/10/01"
#將簡報物件存檔
prs.save("python_ppt_v1.pptx")

Meiko:「這麼容易呀!」

Jason:「對啊,其實用 Python 做出 PPT 簡報一點都不難唷!不過,我還是要一行行跟你說每個程式碼在做什麼,這樣你才可以繼續自己做下去。」

Meiko:「我腦海中想的 PPT 簡報,跟程式做出來的好像還是有點差距,哈哈!看起來有點樸素...」

Jason:「沒那麼快拉,我們先看第一行,如果你在程式碼中有打中文字的話,就一定要有下面這行」

# -*- coding: UTF-8 -*-

Jason:「接著,我們就來看程式碼在做什麼事囉!這行就是用我們 import 的模組 Presentation 產生一個物件出來!」

prs=Presentation()

Jason:「然後我們就要去看說,我們想要增加什麼樣的排列方式,可以用.slide_layouts[數字]來代表,比如說你先把上面那個 python_ppt_v1.pptx 打開,並且用 檢視->投影片母片 的方式打開,你就會發現會有兩個階層的簡報母片檔,.slide_layouts[0]就代表第一張的格式,.slide_layouts[1]第二張的格式,依此類推,你可以試試看下面的 6 種數字對應的格式,選擇不同的.slide_layouts[數字]看會呈現什麼方式,就會比較有感覺囉!」

title_slide_layout= prs.slide_layouts[0]

Jason:「像這行就代表選了上面數字為 0 的格式,並且指定到 title_slide_layout 裡面。」

slide = prs.slides.add_slide(title_slide_layout)

Jason:「接著,我們就用.slides.add_slide 的方式把這張首頁的簡報,加到我們一開始建立的prs裡面。」

Meiko:「歐,也是一步步完成的感覺!」

Jason:「對啊,接下來我們就來設定簡報的標題」

title = slide.shapes.title
title.text = "Hello Python PPT"

Meiko:「這邊沒問題!」

Jason:「最後我們要設定簡報下方的小標,作者就是你拉!」

subtitle = slide.placeholders[1]
subtitle.text = "作者:Meiko 2020/10/01"

Meiko:「大標、小標都做好了,應該要來存檔一下,對吧?」

Jason:「沒錯,我們就開透過.save(檔名)來存檔,我們執行之後,接下來到你工作的資料夾,就可以看到剛剛用 Python 程式執行後得出來的簡報檔 "python_ppt_v1.pptx"」

prs.save("python_ppt_v1.pptx")

Meiko:「我們有了第一頁,應該要有個內頁,那我們先放一張圖再有個大標,比較有感覺!」

# -*- coding: UTF-8 -*-
from pptx import Presentation
import matplotlib.pyplot as plt
from pptx.util import Inches 


#開啟新的簡報物件
prs = Presentation()
#建立簡報檔第一張頁面物件
title_slide_layout = prs.slide_layouts[0] 
#增加一張簡報
slide = prs.slides.add_slide(title_slide_layout)
#設定第一張簡報的標題 
title = slide.shapes.title
title.text = "Hello Python PPT"
#設定第一張簡報的副標題
subtitle = slide.placeholders[1]
subtitle.text = "作者:Meiko 2020/10/01"
#將簡報物件存檔



def add_slide(prs, layout, img):
    #加一張投影片
	slide = prs.slides.add_slide(layout)
	shapes = slide.shapes
	
    #投影片標題
	title_shape = shapes.title
	title_shape.text = '長方圖示範'


	# show the figure
	left = Inches(3)
	height = Inches(4.5)
	left = top = Inches(3)
	pic = slide.shapes.add_picture(img, left, top, height=height)

	return slide


x_labels = ['A','B','C']
sales_num = [120,90,60]
plt.bar(x_labels,sales_num)
plt.savefig('graph.jpg')
img = 'graph.jpg'


title_slide_layout = prs.slide_layouts[1]
slide = add_slide(prs, title_slide_layout ,img)

prs.save("python_ppt_v1.pptx")

Meiko:「Jason,這雖然可以自動產生,但看起來就是一個還沒有編排過的圖檔,實在很不專業耶!」

Jason:「別急麻,我們先來講解一下這部分的內容,你看到最下面從 x_labels的地方,其實跟我們Day-25提到的內容是相同的,只是我們多增加了一行plt.savefig()我們把這個圖檔另外存成一個叫做graph.jpg的檔案。」

Meiko:「歐,這邊只有一點點差異而已。」

Jason:「對啊,然後比較新的東西,就是我們多增加一個函數add_slide,裡面有 3 個輸入的參數,分別是prs,title_slide_layoutimgprstitle_slide_layout前面提過了,img就是前步驟存下來的圖檔當作這個函式的輸入。」

Meiko:「看起來不難麻。哈!」

Jaosn:「還沒講完唷,下面這兩行就是增加一張投影片」

slide = prs.slides.add_slide(layout)
shapes = slide.shapes

Jaosn:「接著,下面這兩行就是增加投影片的標題」

title_shape = shapes.title
title_shape.text = '長方圖示範'

Jason:「最後,就是新增圖檔囉!我們用slide.shapes.add_picture這個方法,然後設定imglefttopheight這幾個參數,概念上就是以 Inches(英吋)為單位,去把該圖片要放在距離投影片左邊和上方的距離定義出來,然後加入到slide就可以囉!」

left = Inches(3)
height = Inches(4.5)
left = top = Inches(3)
pic = slide.shapes.add_picture(img, left, top, height=height)

Meiko:「原來是這樣!」

Jason:「對啊,你剛有提到這投影片好像沒有編排過,可能是因為沒有說明的文字吧!」

def add_slide(prs, layout,img):
	slide = prs.slides.add_slide(layout)
	shapes = slide.shapes
	
    #投影片標題
	title_shape = shapes.title
	title_shape.text = '長方圖示範'

	#投影片內第一大點
	body_shape = shapes.placeholders[1]
	tf = body_shape.text_frame
	tf.text = '這是一個一週銷售狀況的示範'

    #投影片內第二階層小點
	p = tf.add_paragraph()
	p.text = '分別有 A、B、C 三種品牌的銷售量'
	p.level = 1


	# show the figure
	left = Inches(3)
	height = Inches(4.5)
	left = top = Inches(3)
	pic = slide.shapes.add_picture(img, left, top, height=height)

	
	return slide

Jason:「哈囉,你看我在add_slide這個函式裡面,新增加body_shapeadd_paragraph之後,就可以像一般我們在做投影片上打字一樣的感覺!」

Meiko:「這文字好像有一個階層的關係,Jason 你可以講解一下嗎?」

Jason:「不錯唷,你可以把它看成是 slide->shape->text_frame->add_paragraph 這樣的關係。如果你想要加更多階層的字,可以看一下它有一個p.level的方式,像這邊p.level=1,就是大點的下一階層的文字。」

Meiko:「哇,這樣我迫不及待看到一個完整的報告了!!」

牛刀小試

我大寶寶~拉,今天我們談了用 python-pptx 的模組,如果是固定格式的簡報,用 Python 來產生會快很多!

大寶寶平常最常使用的時機就是在產生報表,或是週報,這種不太會有大幅度變化的時間點,雖然剛開始要花一點時間才能熟悉整個程式運作背後的邏輯,但是熟悉之後,要做簡報就變得非常容易了!明天,我們會嘗試把先前做過的圖表,用 Python 放到簡報裡面,想辦法變成一個完整的報告!

給大寶寶留言、分享、鼓勵

歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)

1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!


上一篇
Day-26 在本機端安裝 Anaconda,不用連網也能寫 Python
下一篇
Day-28 用 Python 製作 PPT 投影片,一鍵搞定!(下)
系列文
看對話學 Python 資料分析,用情境故事帶你入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言